# -*- coding: utf-8 -*-
import aima.search as s
#Basicamente el estado lo definimos como una tupla  de dos enteros, que indican los litros en cada jarra
class sonsin(s.Problem):#Redefinimos la clase problem
    def successor(self, e):
        res= [] 	#Creamos la lista de sucesores para el estado actual.
        if e[0]>0: res.append(('Vaciamos Jarra A',(0,e[1])))
        if e[1]>0: res.append(('Vaciamos Jarra B',(e[0],0)))
        if e[0]<4: res.append(('Llenamos Jarra A',(4,e[1])))
        if e[1]<3: res.append(('Llenamos Jarra B',(e[0],3)))
        if e[0]>0 and e[1]<3: res.append(('Pasamos agua de A a B', ([0,1,2,3,4,0,0,0,0][e[0]-(3-e[1])],[0,1,2,3,3,3,3,3][e[0]+e[1]])))
        if e[0]<4 and e[1]>0: res.append(('Pasamos agua de B a A', ([0,1,2,3,4,4,4,4,4][e[0]+e[1]],[0,1,2,3,0,0,0,0][e[1]-(4-e[0])])))
        return res

def heuristica(nodo):
    return  (((abs(2- nodo.state[0]))*5)+nodo.state[1]) #Potenciamos la importancia de Jarra A

if __name__ == '__main__':
    EI= (0,0)   #Estado inicial
    EM= (2,0)   #Estado meta
    agente= sonsin(EI,EM) #Instanciamos al agente
    path_sh= s.breadth_first_graph_search(agente) #Pedimos que encuentre el camino segun un algoritmo
    path_ch= s.best_first_graph_search(agente,heuristica) #Pedimos que encuentre el camino segun un algoritmo con heuristica
    if path_ch is None: print 'Sin solucion'
    else:
        print "Solucion con Heuristica en " + str(len(path_ch.path())) + " movimientos."
        for m in path_ch.path()[::-1]: print str(m.action) + ":" + str(m.state)
        
